package com.wyw.rabbit.learning;

import com.rabbitmq.client.*;

import java.io.IOException;

/**
 * @Title   发布订阅模式的消费者，监听消费消息
 * @Description
 * @Author Mr Wu yewen.wu.china@gmail.com
 * @Date 2024/3/29 14:49
 * Update History:
 * Author        Time            Content
 */
public class PubsubConsumerA {
    public static void main(String[] args) throws Exception {

        // 1、创建连接工厂以及相关的参数配置
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("127.0.0.1");
        factory.setPort(5672);
        factory.setVirtualHost("/");
        factory.setUsername("wyw");
        factory.setPassword("wyw");

        // 2、通过工厂创建连接
        Connection connection = factory.newConnection();

        // 3、创建管道
        Channel channel = connection.createChannel();

        // 4、 创建队列 Queue（简单模式不需要交换机Exchange）
        // 在启动的时候可能先启动的消费者，所以建议也使用
        String fanout_queue_a = "fanout_queue_a";
        channel.queueDeclare(fanout_queue_a, true, false, false, null);

        // 5、消费消息
        Consumer consumer = new DefaultConsumer(channel){
            /**
             * 重写消息配送方法
             * @param consumerTag   消息的标签（唯一标识）
             * @param envelope      信封（一些信息，比如交换机路由等信息）
             * @param properties    配置信息
             * @param body          收到的消息数据
             * @throws IOException
             */
            @Override
            public void handleDelivery(String consumerTag,
                                       Envelope envelope,
                                       AMQP.BasicProperties properties,
                                       byte[] body) throws IOException {
                System.out.println("body = " + new String(body));
            }
        };

        /**
         * queue        监听的队列名
         * autoAck      是否自动确认，true=告知mq消费者已经消费的通知
         * callback     回调函数，处理监听到的消息
         */
        channel.basicConsume(fanout_queue_a, true, consumer);

        // 不释放资源会一直监听

    }
}
